package com.ship.service.impl;


import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ship.commens.Constants;
import com.ship.commens.Result;
import com.ship.dto.AccountDto;
import com.ship.model.Account;
import com.ship.service.AccountService;
import com.ship.mapper.AccountMapper;
import com.ship.util.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
* @author Lucky Boy
* @description 针对表【account】的数据库操作Service实现
* @createDate 2024-07-01 11:52:58
*/
@Service
public class AccountServiceImpl implements AccountService{

    @Autowired
    private AccountMapper accountMapper;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public List<Account> findAll() {
        return accountMapper.selectAll();
    }

    @Override
    public boolean hasAccount(String username) {
        int rows = accountMapper.selectHasAccountByUsername(username);
        if (rows<1){
            return false;
        }
        return true;
    }

    @Override
    public Result findLogin(AccountDto accountDto, HttpSession session) {
        /*1 判断 用户输入的验证码是否正确*/
        String redisCode
                = stringRedisTemplate.opsForValue().get(Constants.REDIS_EMAIL_KEY +
                ":" + accountDto.getUsername() +
                ":" + accountDto.getEmail());

        if (!accountDto.getCaptcha().equals(redisCode)){
            return new Result(-1,"验证码错误或过期");
        }
        /*2 账号密码 是否存在用户*/
        /*对密码进行 加盐加密处理*/
        String md5pwd = MD5Util.finalMD5(accountDto.getPwd());
        accountDto.setPwd(md5pwd);
        Account account = accountMapper.selectAccountByLogin(accountDto);
        if (account==null){
            return new Result(-1,"账号或密码错误");
        }
        /*3session区间储存 登录者信息*/
        session.setAttribute(Constants.ACCOUNT_SESSION_KEY,account.getUsername());
        /*身份信息*/
        session.setAttribute(Constants.ROLE_SESSION_KEY,account.getRole());
        /*登录者 id*/
        session.setAttribute(Constants.ACCOUNT_SESSION_ID,account.getId());
        Result success = Result.SUCCESS;
        success.setData(account);
        return success;
    }

    @Override
    public Result modifyAccountImgUrl(HttpSession session, String imgUrl) {
        /*修改当前登录者的 头像*/
        /*通过 登陆这的 id 获取信息*/
        Long accountId = (Long) session.getAttribute(Constants.ACCOUNT_SESSION_ID);
        int rows = accountMapper.updateAccountImgUtl(accountId,imgUrl);
        if (rows<1){
            return new Result(-1,"修改头像数据失败");
        }
        return Result.SUCCESS;
    }

    @Override
    public Result findAccountsByPage(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        List<Account> accounts = accountMapper.selectAll();
        PageInfo<Account> pageInfo = new PageInfo<>(accounts);
        Result result = Result.SUCCESS;
        result.setData(pageInfo.getList());
        result.setTotal(pageInfo.getTotal());
        return result;
    }

    @Override
    public Result modifyAccountStatus(Integer status, Long id, HttpSession session) {
        /*验证前端传递的参数*/
        if (!(status==0||status==1)||id<0){
            return Result.DATA_FORMAT_ERROR;
        }

        /*判断当前账户 是否是 超级管理员*/
        String role = session.getAttribute(Constants.ROLE_SESSION_KEY)+"";
        if (!role.equals("1")){//不是超级管理员
            return new Result(-1,"您不是超级管理员,没有操作权限");
        }

        /*登陆者 是超级管理员   判断需要修改的 账户 不能是超级管理员*/
        if (id==1){//修改的是超级管理员  不支持
            return new Result(-1,"超级管理员不可以修改状态");
        }
        /*修改普通管理员的 状态*/
        int rows = accountMapper.updateAccountStatus(id,status);
        if (rows<1){
            return new Result(-1,"修改状态失败");
        }
        return Result.SUCCESS;
    }

    @Override
    public Result modifyRestyAccountPwd(Long id, HttpSession session) {
        /*只有超级管理员可以 重置密码*/
        String role = session.getAttribute(Constants.ROLE_SESSION_KEY)+"";
        if (!role.equals("1")){//不是超级管理员
            return new Result(-1,"您不是超级管理员,没有操作权限");
        }
        /*是否修改 超级管理员*/
        if (id== (Long) session.getAttribute(Constants.ACCOUNT_SESSION_ID)){
            session.invalidate();
        }
        /*默认密码 进行加盐加密*/
        String defaultPwd = MD5Util.finalMD5(Constants.DEFAULT_PWD);

        int rows =  accountMapper.updateRestAccountPwd(id,defaultPwd);
        if (rows<1){
            return new Result(-1,"重置密码失败");
        }
        return Result.SUCCESS;
    }

    @Override
    public Result saveAccount(String username, HttpSession session) {
        /*参数验证*/
        if (username==null||!(username.matches("\\w{4,20}"))){
            return Result.DATA_FORMAT_ERROR;
        }
        /*默认密码    已存在的账户 不能添加*/
        String role = session.getAttribute(Constants.ROLE_SESSION_KEY)+"";
        if (!role.equals("1")){//不是超级管理员
            return new Result(-1,"您不是超级管理员,没有操作权限");
        }
        int rows = accountMapper.selectHasAccountByUsername(username);
        if (rows>0){//已存在账号
            return new Result(-1,"添加失败:该账户已存在");
        }
        String defaultPwd = MD5Util.finalMD5(Constants.DEFAULT_PWD);
        rows = accountMapper.insertAccount(username,defaultPwd);
        if (rows<1){
            return new Result(-1,"添加失败");
        }
        return Result.SUCCESS;
    }

    @Override
    public Result removeOneAccountById(Long id, HttpSession session) {
        if (id<1){
            return Result.DATA_FORMAT_ERROR;
        }
        /*判断当前账户 是否是 超级管理员*/
        String role = session.getAttribute(Constants.ROLE_SESSION_KEY)+"";
        if (!role.equals("1")){//不是超级管理员
            return new Result(-1,"您不是超级管理员,没有操作权限");
        }
        /*登陆者 是超级管理员   判断需要修改的 账户 不能是超级管理员*/
        if (id==1){//修改的是超级管理员  不支持
            return new Result(-1,"超级管理员不可以删除");
        }
        int rows = accountMapper.deleteById(id);
        if (rows<1){
            return new Result(-1,"删除失败");
        }
        return Result.SUCCESS;
    }

    @Override
    public Result modifyAccountPwd(String newPwd, HttpSession session) {
        if (newPwd==null||!(newPwd.matches("\\w{6}"))){
            return Result.DATA_FORMAT_ERROR;
        }
        Long id = (Long) session.getAttribute(Constants.ACCOUNT_SESSION_ID);
        String oldPwd = accountMapper.selectPwdById(id);
        /*加密后的密码*/
        newPwd=MD5Util.finalMD5(newPwd);
        if (newPwd.equals(oldPwd)){
            return new Result(-1,"修改密码与旧密码相同");
        }

        int rows = accountMapper.updateRestAccountPwd(id, newPwd);
        if (rows<1){
            return new Result(-1,"修改密码失败");
        }
        session.invalidate();
        return Result.SUCCESS;
    }
}
